package com.opensky.module.sys.interfaces.validator;

import com.opensky.module.sys.infrastructure.exception.MessageCode;
import com.opensky.module.sys.interfaces.assembler.SysDictAssembler;
import com.opensky.module.sys.interfaces.frm.SysDictQueryFrm;
import com.opensky.module.sys.interfaces.frm.SysDictSaveFrm;
import com.opensky.module.sys.interfaces.vo.SysDictVO;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Objects;

/**
 * 字典表(表sys_dict)数据校验对象
 *
 * @author 🇨🇳中国印🇨🇳
 * @date 2021-11-23 15:31:38
 */
public class SysDictValidator {

    /**
     * 根据实际业务校验保存参数
     *
     * @param frm 待校验的frm对象
     */
    public static void validateFrm(SysDictAssembler assembler, SysDictSaveFrm frm) {
        String id = frm.getId();
        if (Objects.equals(id, null)) {
            // 新增数据校验
            validateFrmForInsert(assembler, frm);
        } else {
            // 更新数据校验
            validateFrmForUpdate(assembler, frm);
        }
    }

    /**
     * 方法说明：新增对象做校验
     *
     * @param assembler 转换器
     * @param frm       请求参数
     */
    private static void validateFrmForInsert(SysDictAssembler assembler, SysDictSaveFrm frm) {
        // 字典名称不能重复
        String name = frm.getName();
        List<SysDictVO> nameList = assembler.getList(SysDictQueryFrm.builder().name(name).build());
        if (!CollectionUtils.isEmpty(nameList)) {
            throw MessageCode.DICT_NAME_REPEAT_ERROR.toException();
        }
        // 字典码值不能重复
        String code = frm.getCode();
        List<SysDictVO> codeList = assembler.getList(SysDictQueryFrm.builder().code(code).build());
        if (!CollectionUtils.isEmpty(codeList)) {
            throw MessageCode.DICT_CODE_REPEAT_ERROR.toException();
        }
        // 同级下排序值不能相同
        Long parentId = frm.getParentId();
        if (Objects.equals(parentId, null)) {
            parentId = 0L;
        }
        Integer sort = frm.getSort();
        List<SysDictVO> sortList = assembler.getList(SysDictQueryFrm.builder().parentId(parentId).sort(sort).build());
        if (!CollectionUtils.isEmpty(sortList)) {
            throw MessageCode.DICT_SORT_REPEAT_ERROR.toException();
        }
    }

    /**
     * 方法说明：更新对象做校验
     *
     * @param assembler 转换器
     * @param frm       请求参数
     */
    private static void validateFrmForUpdate(SysDictAssembler assembler, SysDictSaveFrm frm) {
        // 字典名称不能重复
        String name = frm.getName();
        List<SysDictVO> nameList = assembler.getList(SysDictQueryFrm.builder().name(name).build());
        if (!CollectionUtils.isEmpty(nameList)) {
            nameList.forEach(sysDictVO -> {
                if (!Objects.equals(sysDictVO.getId(), frm.getId())) {
                    throw MessageCode.DICT_NAME_REPEAT_ERROR.toException();
                }
            });
        }
        // 字典码值不能重复
        String code = frm.getCode();
        List<SysDictVO> codeList = assembler.getList(SysDictQueryFrm.builder().code(code).build());
        if (!CollectionUtils.isEmpty(codeList)) {
            codeList.forEach(sysDictVO -> {
                if (!Objects.equals(sysDictVO.getId(), frm.getId())) {
                    throw MessageCode.DICT_CODE_REPEAT_ERROR.toException();
                }
            });
        }
        // 同级下排序值不能相同
        Long parentId = frm.getParentId();
        if (Objects.equals(parentId, null)) {
            parentId = 0L;
        }
        List<SysDictVO> sortList = assembler.getList(SysDictQueryFrm.builder().parentId(parentId).sort(frm.getSort()).build());
        if (!CollectionUtils.isEmpty(sortList)) {
            sortList.forEach(sysDictVO -> {
                if (!Objects.equals(sysDictVO.getId(), frm.getId())) {
                    throw MessageCode.DICT_SORT_REPEAT_ERROR.toException();
                }
            });
        }
    }

}

